}
GdkDisplay *
-_gdk_wayland_display_open (const gchar *display_name)
+_gdk_wayland_display_open (struct wl_display *wl_display)
{
- struct wl_display *wl_display;
GdkDisplay *display;
GdkWaylandDisplay *display_wayland;
wl_log_set_handler_client(log_handler);
- wl_display = wl_display_connect(display_name);
- if (!wl_display)
- return NULL;
-
display = g_object_new (GDK_TYPE_WAYLAND_DISPLAY, NULL);
display_wayland = GDK_WAYLAND_DISPLAY (display);
GSList *displays;
gboolean init_failed;
+ struct {
+ struct wl_display *wl_display;
+ gchar *name;
+ } cached_display;
};
struct _GdkWaylandDisplayManagerClass
GCancellable *cancellable,
GError **error)
{
+ GdkWaylandDisplayManager *manager = GDK_WAYLAND_DISPLAY_MANAGER (initable);
struct wl_display *wl_display;
/* Set by the compositor when launching a special client - and it gets reset
if (!wl_display)
{
- GDK_WAYLAND_DISPLAY_MANAGER (initable)->init_failed = TRUE;
+ manager->init_failed = TRUE;
return FALSE;
}
- wl_display_disconnect (wl_display);
-
+ manager->cached_display.name = g_strdup (gdk_get_display_arg_name ());
+ manager->cached_display.wl_display = wl_display;
return TRUE;
}
}
static GdkDisplay *
-gdk_wayland_display_manager_open_display (GdkDisplayManager *manager,
+gdk_wayland_display_manager_open_display (GdkDisplayManager *display_manager,
const gchar *name)
{
- return _gdk_wayland_display_open (name);
+ GdkWaylandDisplayManager *manager = GDK_WAYLAND_DISPLAY_MANAGER (display_manager);
+ struct wl_display *wl_display;
+
+ if (name == manager->cached_display.name ||
+ g_strcmp0 (name, manager->cached_display.name))
+ {
+ /* Cache hit */
+ wl_display = manager->cached_display.wl_display;
+ }
+
+ if (!wl_display)
+ {
+ /* Cache miss */
+ if (manager->cached_display.wl_display)
+ wl_display_disconnect (manager->cached_display.wl_display);
+ wl_display = wl_display_connect (name);
+ }
+
+ /* Use the cache at most once */
+ g_free (manager->cached_display.name);
+ manager->cached_display.wl_display = NULL;
+
+ if (!wl_display)
+ return NULL;
+
+ return _gdk_wayland_display_open (wl_display);
}
static void